package structure.Proxy;

import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.border.*;

import java.awt.*;

public class ProxyDisplay extends JxFrame {
	public ProxyDisplay() {
		super("Display proxied image");
		JPanel p = new JPanel();
		getContentPane().add(p);
		p.setLayout(new BorderLayout());
		String path = System.getProperty("user.dir");
		System.out.println(path);
		ImageProxy image = new ImageProxy(path + "/src/Proxy/src/elliott.jpg",
				321, 271);

		// ImageProxy image = new
		// ImageProxy("c:\\winnt\\web\\Wallpaper\\Windows 2000.jpg", 321, 271);
		p.add("Center", image);
		p.add("North", new Label("    "));
		p.add("West", new Label("  "));
		setSize(370, 350);
		setVisible(true);
	}

	// ------------------------------------
	static public void main(String[] argv) {
		new ProxyDisplay();
	}
}

// ==================================
class ImageProxy extends JPanel implements Runnable {
	int height, width;
	MediaTracker tracker;
	Image img;
	JFrame frame;
	Thread imageCheck; // to monitor loading

	// ------------------------------------

	public ImageProxy(String filename, int w, int h) {
		height = h;
		width = w;

		tracker = new MediaTracker(this);
		img = Toolkit.getDefaultToolkit().getImage(filename);
		tracker.addImage(img, 0); // watch for image loading

		// imageCheck = new Thread(this);
		// imageCheck.start(); //start 2nd thread monitor

		// this begins actual image loading
		try {
			tracker.waitForID(0, 1);
		} catch (InterruptedException e) {
		}
		imageCheck = new Thread(this);
		imageCheck.start(); // start 2nd thread monitor

	}

	// ------------------------------------
	public void paint(Graphics g) {
		if (tracker.checkID(0)) {
			height = img.getHeight(frame); // get height
			width = img.getWidth(frame); // and width

			g.setColor(Color.lightGray); // erase box
			g.fillRect(0, 0, width + 5, height + 5);
			g.drawImage(img, 0, 0, this); // draw loaded image
		} else {
			// draw box outlining image if not loaded yet
			g.setColor(Color.red);
			g.drawRect(1, 1, width + 10, height + 10);
		}
	}

	// ------------------------------------
	public Dimension getPreferredSize() {
		return new Dimension(width, height);
	}

	// public int getWidth() {return width;}
	// public int getHeight(){return height;}
	// ------------------------------------
	public void run() {
		// this thread monitors image loading
		// and repaints when done
		// the 1000 msec is artifically long
		// to allow demo to display with delay
		try {
			Thread.sleep(1000);
			while (!tracker.checkID(0))
				Thread.sleep(1000);
		} catch (Exception e) {
		}
		repaint();
	}
}
